#ifndef __MYLOG_HPP__
#define __MYLOG_HPP__

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <boost/algorithm/string.hpp>  // 字符串切割库引入
#include <vector>

// 开放式日志文件
namespace QiHai
{
    // 枚举说明日志等级
    enum Level
    {
        NORMAL,
        DEBUG,
        WARING,
        ERROR,
        FATAL
    };

    // 获取日期函数
    std::string GetTimeOfDay()
    {
        time_t result = time(nullptr);
        std::string timeDay = asctime(localtime(&result));
        timeDay[timeDay.size() - 1] = '\0';  // 消除最后一个'\n'

        std::vector<std::string> target;
        boost::split(target, timeDay, boost::is_any_of(" "), boost::algorithm::token_compress_on);  // 保存到对应数组，目标字符串，遇到' '全部切割，删除空串

        return target[4] + '-' + target[3];
    }

    // 日志 ，注意最后结尾'\n'将其打印出来
    inline std::ostream& log(const std::string& level, const std::string& fileName, int line)
    {
#ifndef MYDEBUG
        if (level == "DEBUG")
        {
            static std::ofstream _null("/dev/null");  // 打开Linux黑洞文件
            return _null;
        }
#endif
        std::string log;
        // 添加日志等级
        log += "[";
        log += level;
        log += "]";
 
        // 添加输出日志文件名
        log += "[file:";
        log += fileName;
        log += "]";
 
        // 添加日志行号
        log += "[line:";
        log += std::to_string(line);
        log += "]";

        // 添加日期
        log += "[";
        log += GetTimeOfDay();
        log += "]";

        std::cout << log;
        return std::cout;
    }

    #define LOG(level) log(#level, __FILE__, __LINE__)

}
#endif